Pomaly Full outer join

Otázka od: Karel Pecinka

9. 11. 2004 13:50

Cau lidi,
 
v aplikaci potrebuji spojit 2 tabulky na FB pomoci full outer join.
Operace spojeni 2 tabulek o 5000 radcich a 3000 radcich vsak trva
priblizne 2-3 minuty, coz je neunosne dlouho. Da se toto nejak zrychlit?
Ma na rychlost vliv napr. velikost pole podle ktereho se spojuje?
 
V jinem pripade jsem resil i left join a tam pomohlo zapnuti indexu na
tu levou tabulku (z 30 sekund pred indexem to po indexu trvalo mene nez
sekundu).
 
Karel, D5, FB 1.5


Odpovedá: Pospisil Jan

9. 11. 2004 14:17

> v aplikaci potrebuji spojit 2 tabulky na FB pomoci full outer
> join. Operace spojeni 2 tabulek o 5000 radcich a 3000 radcich
> vsak trva priblizne 2-3 minuty, coz je neunosne dlouho. Da se
> toto nejak zrychlit? Ma na rychlost vliv napr. velikost pole
> podle ktereho se spojuje?
>
> V jinem pripade jsem resil i left join a tam pomohlo zapnuti
> indexu na tu levou tabulku (z 30 sekund pred indexem to po
> indexu trvalo mene nez sekundu).

Ahoj,
Chces tim rict, ze tady indexy nemas? Jestli ne, tak se nediv.


Odpovedá: Pavel Cisar

9. 11. 2004 14:23

Haj hou!

On 9 Nov 2004 at 13:16, Karel Pecinka wrote:

> Cau lidi,
>
> v aplikaci potrebuji spojit 2 tabulky na FB pomoci full outer join.
> Operace spojeni 2 tabulek o 5000 radcich a 3000 radcich vsak trva
> priblizne 2-3 minuty, coz je neunosne dlouho. Da se toto nejak zrychlit?
> Ma na rychlost vliv napr. velikost pole podle ktereho se spojuje?
>
> V jinem pripade jsem resil i left join a tam pomohlo zapnuti indexu na
> tu levou tabulku (z 30 sekund pred indexem to po indexu trvalo mene nez
> sekundu).

Full outer join je potvora. Indexy na spojovaci pole by mohly pomoci,
ale neni to zarucene. Velikost (a typ) spojovaciho pole vliv ma,
protoze je typicky nutne udelat sort. Dalsi alternativou je pouzit
dva outer joiny, jeden levy a jeden pravy, a spojit je pres union
(ale ne union all !). Mohlo by byt rychlejsi nez full, ale opet bez
zaruky.

S pozdravem
Pavel Cisar ( ICQ: 89017288)
Mobil: 724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase


Odpovedá: Pospisil Jan

9. 11. 2004 18:02

> > v aplikaci potrebuji spojit 2 tabulky na FB pomoci full outer join.
> > Operace spojeni 2 tabulek o 5000 radcich a 3000 radcich vsak trva
> > priblizne 2-3 minuty, coz je neunosne dlouho. Da se toto nejak
> > zrychlit? Ma na rychlost vliv napr. velikost pole podle ktereho se
> > spojuje?
> >
>
> Full outer join je potvora. Indexy na spojovaci pole by mohly pomoci,
> ale neni to zarucene. Velikost (a typ) spojovaciho pole vliv ma,
> protoze je typicky nutne udelat sort. Dalsi alternativou je pouzit
> dva outer joiny, jeden levy a jeden pravy, a spojit je pres union
> (ale ne union all !). Mohlo by byt rychlejsi nez full, ale opet bez
> zaruky.

2x left join by nepomohlo, stejne by musel delat 3x v pripade dvou left joinu
dokonce 4x merge

Odpovedá: Slavomir Skopalik

9. 11. 2004 18:17

Mohl bys prosim te poslat PLAN a SQL dotaz ?

 Slavek


> >
> > Full outer join je potvora. Indexy na spojovaci pole by
> mohly pomoci,
> > ale neni to zarucene. Velikost (a typ) spojovaciho pole vliv ma,
> > protoze je typicky nutne udelat sort. Dalsi alternativou je pouzit
> > dva outer joiny, jeden levy a jeden pravy, a spojit je pres union
> > (ale ne union all !). Mohlo by byt rychlejsi nez full, ale opet bez
> > zaruky.
>
> 2x left join by nepomohlo, stejne by musel delat 3x v pripade
> dvou left joinu dokonce 4x merge


Odpovedá: Karel PeATinka

9. 11. 2004 19:21

> Mohl bys prosim te poslat PLAN a SQL dotaz ?
>
> Slavek


Plan se mi po spusteni dotazu v ISQL nevypise (Plan not availeble) i kdyz dam
set plan on.
SQL dotaz je pravda trochu brutalni, ale tady je...
na tabulce ordis mam unique index na sloupec EAN, v tabulce Optis jenom
normalni index na sloupec EAN - mnoho carovych kodu zde totiz neni vyplneno.
Doba trvani insertu je 1:43 (minuta a 43 s), vysledkem je asi 7000 radku,
slouci se tak 2500, zbytek se doplnuje z obou tabulek.

Karel

insert into disp (Skupina, ID_Zbozi, EAN, Nazev, Baleni, Cena, DPH, Sklad,
ksVO, Ordis, Dod, PRODEJ0,
PRODEJ1, PRODEJ2, PRODEJ3, PRODEJ4, PRODEJ5, PRODEJ6, PRODEJ7, PRODEJ10,
PRODEJ14, PRODEJ21, PRODEJ28)

select

CASE WHEN o.skupina is not null THEN o.skupina ELSE
z.skupina END as skupina,

CASE WHEN o.id_zbozi is not null THEN o.id_zbozi ELSE
z.id_zbozi END as id_zbozi,

CASE WHEN o.EAN is not null THEN o.EAN ELSE
z.EAN END as EAN,

CASE WHEN o.Nazev is not null THEN o.nazev ELSE
z.Nazev END as Nazev,

CASE WHEN o.Baleni is not null THEN o.baleni ELSE
z.Baleni END as Baleni,

CASE WHEN o.Cena is not null THEN o.cena ELSE
z.cena END as Cena,

CASE WHEN o.DPH is not null THEN o.DPH ELSE
z.DPH END as DPH,

z.Sklad,

o.ksvo,

CASE WHEN o.ID_ZBOZI is not null and z.ID_ZBOZI is null THEN 1 ELSE
CASE WHEN o.ID_ZBOZI is null and z.ID_ZBOZI is not null THEN 2 ELSE 3 END END
as ORDIS,

CASE WHEN o.ID_ZBOZI is not null THEN '+ALY-dod;' ELSE
z.dod END as Dod,

z.PRODEJ0, z.PRODEJ1, z.PRODEJ2, z.PRODEJ3, z.PRODEJ4, z.PRODEJ5, z.PRODEJ6,
z.PRODEJ7, z.PRODEJ10,
z.PRODEJ14, z.PRODEJ21, z.PRODEJ28

from Ordis o

full outer join Optis z on
o.EAN = z.EAN


Odpovedá: Slavomir Skopalik

9. 11. 2004 20:01

doporucuji ti to rozdelit do dvou insertu, nebo unionu.
Prvni projde pomoci left join, druhy pak prida rozdil (to co v druhe
neni).
Slozitost toho prvniho je 2*n, toho druheho m*n.
full outer join FB neumi kulturne zpracovat a ted mne okamzite
nenapada zadna fligna.

Dalsi moznosti by bylo to udelat programova na klientovy.
Natahnout obe tabulky do pameti (setrideny)
a zpracovat to rucne.

 Slavek

>
> Plan se mi po spusteni dotazu v ISQL nevypise (Plan not
> availeble) i kdyz dam set plan on.
> SQL dotaz je pravda trochu brutalni, ale tady je...
> na tabulce ordis mam unique index na sloupec EAN, v tabulce
> Optis jenom normalni index na sloupec EAN - mnoho carovych
> kodu zde totiz neni vyplneno. Doba trvani insertu je 1:43
> (minuta a 43 s), vysledkem je asi 7000 radku, slouci se tak
> 2500, zbytek se doplnuje z obou tabulek.
>
> Karel
>
> insert into disp (Skupina, ID_Zbozi, EAN, Nazev, Baleni,
> Cena, DPH, Sklad, ksVO, Ordis, Dod, PRODEJ0, PRODEJ1,
> PRODEJ2, PRODEJ3, PRODEJ4, PRODEJ5, PRODEJ6, PRODEJ7,
> PRODEJ10, PRODEJ14, PRODEJ21, PRODEJ28)
>